﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Security;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace FrontEndPlus
{
    public partial class wbfrm_Login_Aux : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)        
        {
            Session["datos"] = true;
        }

        #region

        //METODO QUE VALIDA INGRESO Y ABRE LA PANTALLA PRINCIPAL DEL SISTEMA PASANDO LOS DATOS DEL USARIO
        [WebMethod(EnableSession = true)]
        public static string iniciarSesion(string usuario, string pass, bool mantenerseActivo)
        {
            try
            {
                WCF_Gimnasio.cls_Usuario _BSUsuarios = new WCF_Gimnasio.cls_Usuario();
                WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
                _BSUsuarios.Usuario = usuario;
                _BSUsuarios.Contrasena = pass;
                _BSUsuarios = (WCF_Gimnasio.cls_Usuario)_servicio.TraerObjeto(_BSUsuarios);
                _BSUsuarios = validaUsuario(_BSUsuarios, _servicio, pass);
                if (_BSUsuarios.Resultado)
                {
                    HttpContext context = HttpContext.Current;
                    context.Session.Add("idUsuario", _BSUsuarios.IdUsuario);
                    context.Session.Add("nombreUsuario", _BSUsuarios.Nombre);
                    context.Session.Add("idRol", _BSUsuarios.IdRol);
                    context.Session.Add("nombreRol", _BSUsuarios.NombreRol);
                    _servicio.Close();

                    FormsAuthenticationTicket tkt;
                    string cookiestr;
                    HttpCookie ck;
                    if (mantenerseActivo)
                        tkt = new FormsAuthenticationTicket(1, _BSUsuarios.Usuario, DateTime.Now, DateTime.Now.AddDays(365), mantenerseActivo, "Gimnasio");
                    else
                        tkt = new FormsAuthenticationTicket(1, _BSUsuarios.Usuario, DateTime.Now, DateTime.Now.AddMinutes(5), mantenerseActivo, "Gimnasio");
                    cookiestr = FormsAuthentication.Encrypt(tkt);
                    ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);
                    if (mantenerseActivo)
                        ck.Expires = tkt.Expiration;
                    ck.Path = FormsAuthentication.FormsCookiePath;
                    context.Response.Cookies.Add(ck);

                    string strRedirect;
                    strRedirect = context.Request["ReturnUrl"];
                    if (strRedirect == null)
                        strRedirect = "wbfrm_Index.aspx";
                    return "Bienvenido";
                }
                else
                {
                    return _BSUsuarios.MensajeError;
                }
            }
            catch (Exception ex) { return ex.Message; }
        }

        private static WCF_Gimnasio.cls_Usuario validaUsuario(WCF_Gimnasio.cls_Usuario _BSUsuarios, WCF_Gimnasio.ServiceClient _servicio, string txt_password)
        {
            string msg = "";
            if (_BSUsuarios.Resultado)
            {
                if (_BSUsuarios.IdEstado == 2)
                {
                    _BSUsuarios.IdUsuarioInicioSeccion = _BSUsuarios.IdUsuario;
                    if (String.Equals(txt_password, _BSUsuarios.Contrasena))
                    {
                        _BSUsuarios.Resultado = true;
                        _BSUsuarios.Intentos = 0;
                        _servicio.InsertarActualizarRegistro(false, ref msg, _BSUsuarios);
                    }
                    else
                    {
                        if (txt_password != "")
                        {
                            _BSUsuarios.Intentos = _BSUsuarios.Intentos + 1;
                            _BSUsuarios.Resultado = false;
                            _BSUsuarios.MensajeError = "Contraseña Incorrecta  \n" + _BSUsuarios.Intentos + "º intento";

                            if (_BSUsuarios.Intentos == 3 && _BSUsuarios.Usuario != "ADMIN")
                            {
                                _BSUsuarios.IdEstado = 1;
                                _BSUsuarios.MensajeError = "Usuario Bloqueado";
                            }
                            _servicio.InsertarActualizarRegistro(false, ref msg, _BSUsuarios);
                        }
                        else
                        {
                            _BSUsuarios.Resultado = false;
                            _BSUsuarios.MensajeError = "Contraseña en blanco";
                        }
                    }
                }
                else if (_BSUsuarios.IdEstado == 3)
                {
                    _BSUsuarios.Resultado = false;
                    _BSUsuarios.MensajeError = "Debe activar su cuenta, revice su correo electrónico";
                }
                else if (_BSUsuarios.IdEstado == 1)
                {
                    _BSUsuarios.Resultado = false;
                    _BSUsuarios.MensajeError = "Usuario Inactivo, contacte al administrador";
                }
            }
            else
            {
                _BSUsuarios.MensajeError = "El usuario ingresado no existe";
            }
            return _BSUsuarios;
        }

        //METODO QUE ENVIA CONTRASEÑA AL USUARIO QUE LO SOLICITE
        [WebMethod()]
        public static string recuperacionDeContrasena(string usuario)
        {
            try
            {
                string msg = "";
                WCF_Gimnasio.cls_Usuario _BSUsuarios = new WCF_Gimnasio.cls_Usuario();
                WCF_Gimnasio.cls_EnviarCorreos _BSEnvioEmail = new WCF_Gimnasio.cls_EnviarCorreos();
                WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
                _BSUsuarios.Usuario = usuario;
                _BSUsuarios = (WCF_Gimnasio.cls_Usuario)_servicio.TraerObjeto(_BSUsuarios);

                if (_BSUsuarios.Resultado)
                {
                    if (_BSUsuarios.IdEstado == 2)
                    {
                        _BSEnvioEmail.Destinatario = _BSUsuarios.Correo;
                        _BSEnvioEmail.Asunto = "Recuperacion de Contraseña (" + DateTime.Now.ToString("dd / MMM / yyy") + ")";
                        _BSEnvioEmail.Mensaje = "Señor(a) " + _BSUsuarios.Nombre + ", <br><br> Se ha realizado una petición de contraseña para su cuenta en <br> el sistema de Gym 360 " +
                                                "Su contraseña para ingresar al sistema es: <b>" + _BSUsuarios.Contrasena + "</b><br><br><br><br> Muchas Gracias<br>Dudas y comentarios al correo " + "administrador@sodeco.2trweb.com";
                        _servicio.EnviarMail(_BSUsuarios.IdUsuario, ref msg, _BSEnvioEmail);
                        return "Mensaje enviado satisfactoriamente";
                                            }
                    else if (_BSUsuarios.IdEstado == 3)
                    {
                        return "Usuario no esta activado, revice su correo electronico y active su cuenta";
                    }
                    else
                    {
                        return "Usuario esta bloqueado debe solicitar primero el desbloqueo";
                    }
                }
                else
                {
                    return "Usuario ingresado no esta registrado";
                }
            }
            catch (Exception ex) { return ex.Message;  }
        }

        [WebMethod()]
        public static string solicitudDesbloqueo(string usuario)
        {
            try
            {
                string msg = "";
                WCF_Gimnasio.cls_Usuario _BSUsuarios = new WCF_Gimnasio.cls_Usuario();
                WCF_Gimnasio.cls_EnviarCorreos _BSEnvioEmail = new WCF_Gimnasio.cls_EnviarCorreos();
                WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
                _BSUsuarios.Usuario = usuario;
                _BSUsuarios = (WCF_Gimnasio.cls_Usuario)_servicio.TraerObjeto(_BSUsuarios);

                if (_BSUsuarios.Resultado)
                {
                    if (_BSUsuarios.IdEstado == 1)
                    {

                        _BSEnvioEmail.Destinatario = _BSUsuarios.Correo;
                        _BSEnvioEmail.Asunto = "Desbloqueo de Usuario de: " + _BSUsuarios.Usuario + "; solicitud del dia:  (" + DateTime.Now.ToString("dd / MMM / yyy") + ")";
                        _BSEnvioEmail.Mensaje = "Este mensajes es una solicitud del usuario " + _BSUsuarios.Nombre + ",  <br><br> para solilitar por medio del sistema de login el desbloqueo en <br> el sistema de Gym 360 " +
                                                "<br><br><br><br> Muchas Gracias<br>Dudas y comentarios al correo " + "administrador@sodeco.2trweb.com";
                        _servicio.EnviarMail(_BSUsuarios.IdUsuario, ref msg, _BSEnvioEmail);
                        return "Mensaje enviado satisfactoriamente";
                    }
                    else if (_BSUsuarios.IdEstado == 3)
                    {

                        return "Cuenta no ha sido activada";
                    }
                    else
                    {
                        return "Usuario no esta bloqueado";
                    }
                }
                else
                {
                    return "Usuario ingresado no esta registrado";
                }

            }
            catch (Exception ex) { return ex.Message; }
        }

        [WebMethod()]
        public static string cerrarSesion()
        {
            FormsAuthentication.SignOut();
            return "wbfrm_Login.aspx";
            //FormsAuthentication.RedirectToLoginPage();
        }

        [WebMethod()]
        public static string ingresoRegistro(string nombre,string cedula, string telefono, string contrasena, string repetirContrasena)
        {
            try
            {
            WCF_Gimnasio.cls_Usuario _BSUsuario = new WCF_Gimnasio.cls_Usuario();
            WCF_Gimnasio.cls_Usuario _BSValidaUsuario = new WCF_Gimnasio.cls_Usuario();
            WCF_Gimnasio.cls_EnviarCorreos _BSEnvioEmail = new WCF_Gimnasio.cls_EnviarCorreos();
            WCF_Gimnasio.cls_Cliente _BSCliente = new WCF_Gimnasio.cls_Cliente();
            WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
            
             string msg = "";
             string msgEmail = "";
             if (!string.IsNullOrWhiteSpace(nombre) && !string.IsNullOrWhiteSpace(cedula))
                {
                    if (contrasena == repetirContrasena)
                    {
                        _BSCliente.Cedula = cedula;
                        _BSCliente.FiltraConsulta = "SeleccionaPorCedula";
                        _BSCliente.IdUsuarioInicioSeccion = 1;
                        _BSCliente = (WCF_Gimnasio.cls_Cliente)_servicio.TraerObjeto(_BSCliente);
                        if (_BSCliente.Resultado)
                        {
                            if (_BSCliente.Matriculado == true)
                            {
                                if (telefono.ToString().Length == 8)
                                {
                                    if (contrasena.Length >= 5)
                                    {
                                        if (!contrasena.Contains(" "))
                                        {
                                            _BSUsuario.IdUsuarioInicioSeccion = 1;
                                            _BSUsuario.Nombre = nombre;
                                            _BSUsuario.Usuario = cedula;
                                            _BSValidaUsuario.Usuario = cedula;
                                            _BSValidaUsuario = (WCF_Gimnasio.cls_Usuario)(_servicio.TraerObjeto(_BSValidaUsuario));
                                            if (_BSValidaUsuario.Resultado == false)
                                            {
                                                _BSUsuario.Descripcion = "CLIENTE";
                                                _BSUsuario.Contrasena = contrasena;
                                                _BSUsuario.Cedula = cedula;
                                                _BSUsuario.Telefono = Convert.ToInt32(telefono);
                                                _BSUsuario.IdRol = 8;
                                                _BSUsuario.IdEstado = 3;
                                                _BSUsuario.Correo = _BSCliente.Correo;
                                                _servicio.InsertarActualizarRegistro(true, ref msg, _BSUsuario);

                                                if (msg == "Ingreso Correcto")
                                                {
                                                    DataTable data = _servicio.Listar(3, _BSUsuario).Tables[0];

                                                    _BSEnvioEmail.Destinatario = data.Rows[0]["Email"].ToString();
                                                    _BSEnvioEmail.Asunto = "Activacion de cuenta - Gym 360";
                                                    _BSEnvioEmail.Mensaje = "Señor(a) " + data.Rows[0]["NOMBRE"].ToString() + ", <br><br> Debe ingresar al siguiente link para habilitar su cuenta en un periodo de 6 horas<br>" +
                                                                            "El link de activacion es: <br><b>" + "http://localhost:3211/wbfrm_Habilitar_Cuenta_Cliente.aspx?uid=" + data.Rows[0]["UNIQUE_ID"].ToString() + "&id=" + data.Rows[0]["USUARIO"].ToString() + "</b><br><br><br><br> Muchas Gracias<br>Dudas y comentarios al correo " + "administrador@sodeco.2trweb.com";
                                                    _servicio.EnviarMail(Convert.ToInt32(data.Rows[0]["ID"]), ref msgEmail, _BSEnvioEmail);
                                                }
                                                _servicio.Close();
                                                return msg + "\n" + msgEmail;
                                            }
                                            else
                                            {
                                                return "Este cliente ya fue registrado";
                                            }
                                        }
                                        else
                                        {
                                            return "La contraseña no puede contener espacios en blanco";
                                        }
                                    }
                                    else
                                        return "La contraseña debe tener como minimo 5 caracteres";
                                }
                                else
                                    return "El campo teléfono no se relleno correctamente";
                            }
                            else
                                return "El cliente seleccionado no esta matriculado";
                        }
                        else
                            return "La cédula ingresada no corresponde a la de un cliente del gimnasio";
                    }
                    else
                        return "Campo contraseña no es igual";
                }
                else
                    return "Los campos con (*) son obligatorios";
            }
            catch (Exception ex) { return ex.Message; }
        }

        private static Boolean emailBienEscrito(String email)
        {
            String expresion;
            expresion = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
            if (Regex.IsMatch(email, expresion))
                if (Regex.Replace(email, expresion, String.Empty).Length == 0)
                    return true;
                else
                    return false;
            else
                return false;
        }

        #endregion
    }
}